package ljk.util.mybatis.generator;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.ljk.util.string.StringUtil;
import lombok.AllArgsConstructor;

import java.io.File;
import java.util.Scanner;
/**
 *
 * @author ljk
 * @since 2025/3/21 0:38
 */
public class MybatisPlusGen {
    /** 作者 */
    private static String author = null;
    /** 表名 */
    private static String[] tableNames = {};
    /** 覆盖已有文件开关 */
    private static Boolean overrideFlag = null;
    /** swagger2开关 */
    private static final boolean swagger2Flag = true;
    /** 写入lombok注解 */
    private static final boolean lombokSwitch = true;
    /** 链式调用开关 */
    private static final boolean chainModel = true;
    /** 主键生成类型 */
    private static final IdType defaultIdType = IdType.AUTO;

    /** 输出路径 */
    private static final String outputDir = System.getProperty("user.dir") + "/src/main/java".replace("/", File.separator);
    /** 逻辑删除字段名 */
    private static final String logicDeleteFieldName = null;
    /** 父包名 */
    private  static final String parentPackage = MybatisPlusGen.class.getPackage().getName();
    /** 不生成的模板,目前只有controller ,具体看枚举*/
    private static final TemplateType[] disableTemplateTypes = {TemplateType.CONTROLLER};
    public static void main(String[] args) {

        System.out.println("输出文件的路径:"+outputDir);
        System.out.println("父包名:"+parentPackage);
        if (logicDeleteFieldName!=null){
            System.out.println("配置了逻辑删除的字段:"+logicDeleteFieldName);
        }




        DbConfig dbConfig = new DbConfig("jdbc:mysql://localhost:3306", "com.mysql.cj.jdbc.Driver", "root", "password");

        String dbStr = scanner("数据库名");


        AutoGenerator autoGenerator = getAutoGenerator(dbConfig);
        System.out.println("开始生成");
//        autoGenerator.execute();
    }

    private static String scanner(String tip) {
        System.out.println(("请输入" + tip + "："));
        Scanner sc = new Scanner(System.in);
        return sc.next();
    }


    @AllArgsConstructor
    static class DbConfig{
        private String url;
        private String driverName;
        private String username;
        private String password;
    }


    /**
     * 创建mybatis-plus生成器
     * @author ljk
     * @since 2025/3/13 0:10
     */
    private static AutoGenerator getAutoGenerator(DbConfig dbConfig) {
        if (StringUtil.isEmpty(author)){
            author = scanner("作者");
        }
        String tableNameStr = scanner("表名多个表用逗号分隔");
        if (overrideFlag==null){
            String overrideFlagStr = scanner("覆盖文件?(y/n)");
            overrideFlag = "y".equals(overrideFlagStr)||"yes".equals(overrideFlagStr);
        }


        // 数据源配置
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        dataSourceConfig.setUrl(dbConfig.url) // 数据库连接URL
                .setUsername(dbConfig.username) // 数据库用户名
                .setPassword(dbConfig.password) // 数据库密码
                .setDriverName(dbConfig.driverName); // 数据库驱动类名

        GlobalConfig globalConfig = new GlobalConfig();
        globalConfig.setOutputDir(outputDir) // 设置输出目录
                .setAuthor(author) // 设置作者
                .setOpen(false) // 设置生成后是否自动打开目录
                .setFileOverride(overrideFlag) // 设置文件存在时是否覆盖
                .setIdType(defaultIdType) // 设置主键生成策略
                .setSwagger2(swagger2Flag) // 设置是否生成Swagger注解
                .setControllerName("%sController")
                .setServiceName("%sService") // 设置Service接口名后缀
                .setServiceImplName("%sServiceImpl")
                .setMapperName("%sMapper")
                .setXmlName("%sMapper");

        // 策略配置
        StrategyConfig strategyConfig = new StrategyConfig();
        strategyConfig.setInclude(tableNames) // 指定需要生成代码的表名
                .setNaming(NamingStrategy.underline_to_camel) // 设置表名转类名策略
                .setColumnNaming(NamingStrategy.underline_to_camel) // 设置列名转属性名策略
                .setEntityLombokModel(lombokSwitch) // 设置实体类使用Lombok模型
                .setRestControllerStyle(true) // 设置Controller使用REST风格
                .setChainModel(chainModel)
                .setLogicDeleteFieldName(logicDeleteFieldName);
        // 包配置
        PackageConfig packageConfig = new PackageConfig();
        packageConfig.setParent(parentPackage) // 设置父包名
                .setMapper("mapper") // 设置Mapper接口所在的子包名
                .setEntity("entity") // 设置实体类所在的子包名
                .setController("controller") // 设置Controller所在的子包名
                .setService("service") // 设置Service所在的子包名
                .setServiceImpl("service.impl")
                .setXml("mapper"); // 设置Mapper XML文件所在的子包名

        // 模板配置
        TemplateConfig templateConfig = new TemplateConfig();
        templateConfig.disable(disableTemplateTypes);

        // 整合配置
        AutoGenerator autoGenerator = new AutoGenerator();
        autoGenerator.setGlobalConfig(globalConfig)
                .setDataSource(dataSourceConfig)
                .setStrategy(strategyConfig)
                .setPackageInfo(packageConfig)
                .setTemplate(templateConfig)
//                .setTemplateEngine();//默认使用Velocity引擎模板
        ;
        return autoGenerator;
    }
}
